oauth

您所在的位置:网站首页 javamail imap oauth

oauth

2023-03-10 21:25| 来源: 网络整理| 查看: 265

Мы пытаемся подключить клиент javamail (1.6) к нашему почтовому ящику office365, размещенному в office365, с использованием аутентификации OAUTH2.

Что бы мы ни делали, мы продолжаем получать ошибку A1 NO AUTHENTICATE.

Мы зарегистрировали наше приложение в

Разрешение API

1

Мы следовали всем инструкциям, изложенным в

https://learn.microsoft.com/en-us/exchange/client-developer/legacy-protocols/how-to-authenticate-an-imap-pop-smtp-application-by-using-oauth

Включая запуск команд powershell для создания принципала с использованием идентификатора приложения и идентификатора объекта, и мы предоставили приложению полный доступ к почтовому ящику, к которому мы хотим получить доступ.

Для аутентификации мы делаем HTTP POST следующим образом, который генерирует токен доступа.

Это поток учетных данных клиента с общим секретом, как описано здесь. https://learn .microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow

https://login.microsoftonline.com/{наш идентификатор клиента}/oauth2/v2.0/ жетон с

client_id=... client_secret=... grant_type=client_credentials scope=https://outlook.office365.com/.default

Наша конфигурация javamail

mail.store.protocol="imap" mail.imap.host="outlook.office365.com" mail.imap.port="993" mail.imap.ssl.enable="true" mail.imap.starttls.enable="true" mail.imap.auth="true" mail.imap.auth.mechanisms="XOAUTH2" mail.imap.user=""

Затем в нашем java-коде мы подключаем хранилище с токеном доступа, полученным из вышеуказанного HTTP POST

store.connect(host, user, oauth2_access_token);

Мы также попробовали этот скрипт powershell, который возвращает ту же ошибку.

https://github.com/DanijelkMSFT/ThisandThat/blob/main/Get-IMAPAccessToken.ps1

Я не считаю, что проблема специфична для JavaMail.

Чрезвычайно сложно определить, имеет ли токен доступа правильные права или есть что-то еще, что мешает аутентификации.

Что еще мы можем попробовать?

Обновление 1

Если мы используем скрипт powershell

https://github.com/DanijelkMSFT/ThisandThat/blob/main/Get-IMAPAccessToken.ps1

Передавая только идентификатор клиента и redirectUri, сценарий запрашивает у меня одобрение, и он преуспевает

Но если мы используем clientsecret авторизация не работает

Обновление 2

Я могу успешно использовать javamail с токеном доступа, сгенерированным сценарием powershell.

Очевидно, что токен, созданный с помощью clientsecret, не имеет достаточных прав для доступа к IMAP или почтовому ящику.

Я начинаю задаваться вопросом, не работают ли запросы токенов с использованием секрета клиента, потому что в нашей Azure Active Directory включены «параметры безопасности по умолчанию».

Возможно, применяется MFA, поэтому любые неинтерактивные запросы блокируются.

Обновление 3

https://jwt.ms позволяет декодировать токены доступа

Токен, созданный только с идентификатором клиента (поток предоставления кода), сильно отличается от токена, созданного с помощью client_secret (поток учетных данных клиента).

В токене из «интерактивного предоставления кода» есть атрибут под названием «scp» Set of Scopes, в котором перечислены области действия независимо от того, что у меня есть в разрешении API моего клиентского приложения ????

"scp": "IMAP.AccessAsUser.All Mail.Read Mail.Read.All Mail.Read.Shared Mail.ReadBasic User.Read"

Второй токен из потока учетных данных клиента имеет атрибут «роли», но не имеет областей действия.

"roles": ["IMAP.AccessAsApp"]

РАЗРЕШЕНО!

Глядя на токен доступа, мы заметили, что субъект потока учетных данных клиента (sub) был идентификатором, который мы не настроили.

Вот в чем загвоздка: при создании субъекта-службы с помощью powershell в онлайн-обменнике в качестве идентификатора службы вы должны использовать идентификатор объекта корпоративного приложения.

New-ServicePrincipal -AppId {clientid} -ServiceId {идентификатор объекта корпоративного приложения -Organization {tenantid}

При создании регистрации приложения в Azure AD вы также создаете корпоративное приложение.

Идентификатор объекта приложения отличается от идентификатора объекта корпоративного приложения.

Поток учетных данных клиента использует идентификатор объекта корпоративного приложения в качестве пользователя, запрашивающего авторизацию.

То же самое для предоставления доступа к почтовому ящику с помощью powershell

Add-MailboxPermission -Identity {email} -User -ServiceId {идентификатор объекта корпоративного приложения -AccessRights FullAccess

Жаль, что процесс аутентификации такой громоздкий

oauth-2.0 azure-active-directory office365 jakarta-mail imap 11 Ivan Pedruzzi 23 Авг 2022 в 21:13 Можете ли вы объяснить немного больше, где использовать objectID? Я использую такой код в java: `HttpPost loginPost = new HttpPost("login.microsoftonline.com " + tanantId + "/oauth2/v2.0/токен"); String scopes = "outlook.office365.com/.default"; String encodedBody = "client_id=" + clientId + "&scope=" + scopes + "&client_secret=" + client_secret + "&grant_type=client_credentials"; loginPost.setEntity (новый StringEntity (encodedBody, ContentType.APPLICATION_FORM_URLENCODED)); ` где я должен использовать objectiD здесь?  – Ralph 21 Окт 2022 в 18:49 Ральф, objectId используется для создания servicePrincipal в office365. Эти задачи могут выполнять только администраторы вашей учетной записи office365. Существуют сценарии PowerShell, которые необходимо выполнить для создания servicePricipal, которые являются пользователями, выдающими себя за приложения, определенные в Azure Active Directory.  – Ivan Pedruzzi 22 Окт 2022 в 20:51 Правильный синтаксис `-User -ServiceId`?  – Apostolos 13 Янв 2023 в 11:58 Add-MailboxPermission -Identity {email} -ServiceId {идентификатор объекта корпоративного приложения} -AccessRights FullAccess  – Ivan Pedruzzi 13 Янв 2023 в 23:47 1 ответ

Мои два цента по этому поводу: если вы все еще сталкиваетесь с ошибкой аутентификации из-за того, что javamail пытается подключиться к почтовому ящику и читать электронные письма, прежде всего убедитесь, что установка приложения в активном каталоге azure имеет следующие разрешения.

IMAP.AccessAsApp

Почта.Чтение

Mail.Send (для отправки)

Во-вторых, создайте субъект-службу с идентификатором корпоративного приложения, как указано в исходном сообщении. После этого проверьте здесь, есть ли у созданного вами токена все роли, которые вы назначили.

Даже если вы назначили необходимые роли и можете подключиться к почтовому ящику через powershell, вы все равно можете получить AUTHENTICATE failed от javamail, потому что вы можете неправильно использовать это свойство (mail.imap.auth.mechanisms), замените mail.imap с помощью mail.imaps, и это должно решить проблему.

"mail.imaps.auth.mechanisms"="XOAUTH2" "mail.imap.host"="outlookoffice365.com" "mail.smtp.port"=993 "mail.store.protocol"="imaps" session.getStore("imaps") store.connect(host,port,user,token)

Удачи !!

0 Yash Keshre 1 Фев 2023 в 18:43


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3